S3 Express One Zone のリスト・読み取りアクションを許可した際の挙動について調べてみた
皆さんこんにちは、AWS 事業本部のヒラネです。
IAM ポリシーで S3 Express One Zone(ディレクトリバケット)のリスト・読み取りアクションを許可した際の挙動について調査をする機会がありましたのでご紹介します。
いきなりまとめ
- S3 Express One Zone の IAM ポリシーでは、"s3express:CreateSession" の条件句でオブジェクトの読み取り、書き込みを制御できる。
- デフォルトでは 全てのゾーンエンドポイント API(ReadWrite)が許可されるため、オブジェクトの書き込みアクションが実施可能となる。
- コンソール上でディレクトリバケット一覧をリストするためには "s3express:CreateSession" アクションの許可が必要である。
S3 Express One Zone とは
高パフォーマンスでシングルアベイラビリティーゾーンの Amazon S3 ストレージ クラスであり、以下のような特徴があります[1]。
- S3 Standard ストレージクラスよりも最大 10 倍優れたデータアクセス速度
- 1 桁ミリ秒単位で一貫したデータアクセスを提供
- リクエスト料金は S3 Standardストレージクラスよりも50%安い
- データは新しいバケットタイプである Amazon S3 ディレクトリバケットに保存する
- データは単一のアベイラビリティーゾーン内で冗長的に複数のデバイスに保存される。
S3 Express One Zone へのアクセスに必要な IAM ポリシー
S3 Express One Zone は通常の S3 とは名前空間が異なり、IAM ポリシーで許可をする際には以下のように "s3express:*" のような形式でアクションを許可する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3express:*"
],
"Resource": "*"
}
]
}
また、AmazonS3FullAccess や ReadOnlyAccess ポリシーには S3 Express One Zone へのアクセス許可が含まれていない点にも注意が必要です(2024/09/15 現在)。
現在、s3express で用意されているアクション一覧は以下です [2]。
- s3express:CreateBucket
- s3express:CreateSession
- s3express:DeleteBucket
- s3express:DeleteBucketPolicy
- s3express:GetBucketPolicy
- s3express:ListAllMyDirectoryBucket
- s3express:PutBucketPolicy
[2]:S3 Express One Zone 向け AWS Identity and Access Management (IAM)
S3 Express One Zone のリスト・読み取りアクセスに必要な IAM ポリシーを確認してみた
S3 Express One Zone のアクション一覧には、通常の S3 に存在する ListBucket や GetObject などのアクションがありません。
アクション一覧には以下の記述があり、"s3express:CreateSession" が GetObject へのアクセス許可を担うようです。
s3express:CreateSession セッショントークンを作成する権限を付与します。このセッショントークンは、PutObject、GetObject などのすべてのゾーン (オブジェクトレベル) API オペレーションへのアクセスを許可するために使用されます。
上記説明で触れられている ゾーン API オペレーションの一覧は以下の URL の表で紹介されている [エンドポイントタイプ] がゾーン別となっているものです [3]。
また、"s3express:CreateSession" アクションの条件キーで s3express:SessionMode を指定することで、読み取りと書き込みのアクセス許可を制御可能なようです [4]。
s3express:SessionMode
CreateSession API オペレーションがリクエストしたアクセス許可でアクセスをフィルタリングします。デフォルトでは、このセッションは ReadWrite です。この条件キーを使用して、ReadOnly アクセスを制限したり、ReadWrite アクセスを明示的に拒否したりできます。
今回は、実際に操作をしながらS3 Express One Zone のリスト・読み取りアクセスに必要な権限について調査をしてみました。
以下のアクションを許可したケースについて、S3 Express One Zone でオブジェクトのリスト・ダウンロードやアップロードなどのアクションを実施しています。
- ポリシー作成時のビジュアルでリスト・読み取りアクセスを全て許可した場合
- "s3express:CreateSession" の条件キーでで ReadOnly のみを指定した場合
- CreateSession を許可しない場合
ポリシー作成時のビジュアルでリスト・読み取りアクセスを全て許可した場合
以下のようにコンソールのビジュアルにてリスト・読み取りアクションのみを許可したポリシーを作成します。
作成された以下のポリシーをテスト用の IAM ユーザーに付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3express:CreateSession",
"s3express:GetBucketPolicy",
"s3express:ListAllMyDirectoryBuckets"
],
"Resource": "*"
}
]
}
今回は以下のテスト用 S3 ディレクトリバケットを作成し、オブジェクトに対する操作を実施しました。
上記のポリシーを付与したユーザーで各種操作をした結果は以下となりました。
- オブジェクトのリスト・ダウンロード
- ともに実施可能でした。
- オブジェクトのアップロード
- 実施可能でした。
- オブジェクトの削除
- 実施可能でした。
コンソール上のビジュアルにてリスト・読み取りアクションのみを許可したポリシーを付与した場合でも、オブジェクトのアップロード・削除といった書き込み操作が許可されてしまう点に注意が必要です。
これは、"s3express:CreateSession" アクションがデフォルトでは全てのゾーンエンドポイント API(ReadWrite)アクションを許可するためです。
"s3express:CreateSession" の条件キーでで ReadOnly を指定して許可した場合
s3express:CreateSession の条件キーで ReadOnly のみを指定して許可した以下の IAM ポリシーを作成してテスト用の IAM ユーザーに付与しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3express:CreateSession",
"s3express:GetBucketPolicy",
"s3express:ListAllMyDirectoryBuckets"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"s3express:SessionMode": "ReadOnly"
}
}
}
]
}
上記のポリシーを付与したユーザーで各種操作をした結果は以下となりました。
- オブジェクトのリスト・ダウンロード
- ともに実施可能でした。
- オブジェクトのアップロード・削除
- ともにアクセス拒否により失敗しました。
IAM ポリシーの条件句に ReadOnly を設定することで、ゾーンエンドポイント API のうち読み取りのアクションのみが許可される挙動になりました。
"s3express:CreateSession" を許可しない場合
以下のように IAM ポリシーの許可から"s3express:CreateSession" を削除したものを付与しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3express:GetBucketPolicy",
"s3express:ListAllMyDirectoryBuckets"
],
"Resource": "*"
}
]
}
すると、以下のようにコンソール上からはディレクトリバケットのリストが実施不可となりました。
エラーメッセージには "s3express:ListAllMyDirectoryBuckets" を許可するように注意書きがありますが、今回のポリシーではすでに許可がされています。
コンソール上からバケット一覧をリストするためには "s3express:ListAllMyDirectoryBuckets" に加えて "s3express:CreateSession" アクションも許可する必要があるようです。
なお、CLI ではバケット一覧のリストは可能でした。
$ aws s3api list-directory-buckets --region ap-northeast-1
{
"Buckets": [
{
"Name": "readonlytestbucket--apne1-az4--x-s3",
"CreationDate": "2024-09-15T06:11:30.887000+00:00"
}
]
}
まとめ
今回は IAM ポリシーで S3 Express One Zone(ディレクトリバケット)のリスト・読み取りアクションを許可した際の挙動について調査してみました。
その結果、IAM ポリシー作成時のコンソール上のビジュアルにてリスト・読み取りアクションのみを許可したポリシーを付与した場合でも、 "s3express:CreateSession" が許可されオブジェクトの書き込みも可能になることがわかりました。
オブジェクトへの読み取りアクションのみを許可するためには "s3express:CreateSession" のコンディション句で ReadOnly を指定する必要があります。
また、コンソール上でディレクトリバケット一覧を表示するためには "s3express:CreateSession" アクションの許可が必要であることがわかりました。
この記事がどなたかのお役に立つと幸いです。
以上、ヒラネでした!